CM3D2 Converter.misc_OBJECT_PT_context_object

  1# 「プロパティ」エリア → 「オブジェクト」タブ
  2import re
  3import bpy
  4import mathutils
  5from . import common
  6from . import compat
  7
  8
  9# メニュー等に項目追加
 10def menu_func(self, context):
 11    ob = context.object
 12    if not ob or ob.type != 'MESH':
 13        return
 14
 15    bone_data_count = 0
 16    if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
 17        for key in ob.keys():
 18            if re.search(r'^(Local)?BoneData:\d+$', key):
 19                bone_data_count += 1
 20    enabled_clipboard = False
 21    clipboard = context.window_manager.clipboard
 22    if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard:
 23        enabled_clipboard = True
 24
 25    if bone_data_count or enabled_clipboard:
 26        col = self.layout.column(align=True)
 27        row = col.row(align=True)
 28        row.label(text="CM3D2用ボーン情報", icon_value=common.kiss_icon())
 29        sub_row = row.row()
 30        sub_row.alignment = 'RIGHT'
 31        if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
 32            bone_data_count = 0
 33            for key in ob.keys():
 34                if re.search(r'^(Local)?BoneData:\d+$', key):
 35                    bone_data_count += 1
 36            sub_row.label(text=str(bone_data_count), icon='CHECKBOX_HLT')
 37        else:
 38            sub_row.label(text="0", icon='CHECKBOX_DEHLT')
 39        row = col.row(align=True)
 40        row.operator('object.copy_object_bone_data_property', icon='COPYDOWN', text="コピー")
 41        row.operator('object.paste_object_bone_data_property', icon='PASTEDOWN', text="貼付け")
 42        row.operator('object.remove_object_bone_data_property', icon='X', text="")
 43
 44@compat.BlRegister()
 45class CNV_OT_copy_object_bone_data_property(bpy.types.Operator):
 46    bl_idname = 'object.copy_object_bone_data_property'
 47    bl_label = "ボーン情報をコピー"
 48    bl_description = "カスタムプロパティのボーン情報をクリップボードにコピーします"
 49    bl_options = {'REGISTER', 'UNDO'}
 50
 51    @classmethod
 52    def poll(cls, context):
 53        ob = context.active_object
 54        if ob:
 55            if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
 56                return True
 57        return False
 58
 59    def execute(self, context):
 60        output_text = ""
 61        ob = context.active_object
 62        pass_count = 0
 63        if 'BaseBone' in ob:
 64            output_text += "BaseBone:" + ob['BaseBone'] + "\n"
 65        for i in range(99999):
 66            name = "BoneData:" + str(i)
 67            if name in ob:
 68                output_text += "BoneData:" + ob[name] + "\n"
 69            else:
 70                pass_count += 1
 71            if 10 < pass_count:
 72                break
 73        pass_count = 0
 74        for i in range(99999):
 75            name = "LocalBoneData:" + str(i)
 76            if name in ob:
 77                output_text += "LocalBoneData:" + ob[name] + "\n"
 78            else:
 79                pass_count += 1
 80            if 10 < pass_count:
 81                break
 82        context.window_manager.clipboard = output_text
 83        self.report(type={'INFO'}, message="ボーン情報をクリップボードにコピーしました")
 84        return {'FINISHED'}
 85
 86
 87@compat.BlRegister()
 88class CNV_OT_paste_object_bone_data_property(bpy.types.Operator):
 89    bl_idname = 'object.paste_object_bone_data_property'
 90    bl_label = "ボーン情報を貼付け"
 91    bl_description = "カスタムプロパティのボーン情報をクリップボードから貼付けます"
 92    bl_options = {'REGISTER', 'UNDO'}
 93
 94    @classmethod
 95    def poll(cls, context):
 96        ob = context.active_object
 97        if ob:
 98            clipboard = context.window_manager.clipboard
 99            if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard:
100                return True
101        return False
102
103    def execute(self, context):
104        ob = context.active_object
105        pass_count = 0
106        for i in range(99999):
107            name = "BoneData:" + str(i)
108            if name in ob:
109                del ob[name]
110            else:
111                pass_count += 1
112            if 10 < pass_count:
113                break
114        pass_count = 0
115        for i in range(99999):
116            name = "LocalBoneData:" + str(i)
117            if name in ob:
118                del ob[name]
119            else:
120                pass_count += 1
121            if 10 < pass_count:
122                break
123        bone_data_count = 0
124        local_bone_data_count = 0
125        for line in context.window_manager.clipboard.split("\n"):
126            if line.startswith('BaseBone:'):
127                ob['BaseBone'] = line[9:]  # len('BaseData:') == 9
128                continue
129
130            if line.startswith('BoneData:'):
131                if line.count(',') >= 4:
132                    name = "BoneData:" + str(bone_data_count)
133                    ob[name] = line[9:]  # len('BoneData:') == 9
134                    bone_data_count += 1
135                continue
136
137            if line.startswith('LocalBoneData:'):
138                if line.count(',') == 1:
139                    name = "LocalBoneData:" + str(local_bone_data_count)
140                    ob[name] = line[14:]  # len('LocalBoneData:') == 14
141                    local_bone_data_count += 1
142        self.report(type={'INFO'}, message="ボーン情報をクリップボードから貼付けました")
143        return {'FINISHED'}
144
145
146@compat.BlRegister()
147class CNV_OT_remove_object_bone_data_property(bpy.types.Operator):
148    bl_idname = 'object.remove_object_bone_data_property'
149    bl_label = "ボーン情報を削除"
150    bl_description = "カスタムプロパティのボーン情報を全て削除します"
151    bl_options = {'REGISTER', 'UNDO'}
152
153    @classmethod
154    def poll(cls, context):
155        ob = context.active_object
156        if ob:
157            if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
158                return True
159        return False
160
161    def invoke(self, context, event):
162        return context.window_manager.invoke_props_dialog(self)
163
164    def draw(self, context):
165        self.layout.label(text="カスタムプロパティのボーン情報を全て削除します", icon='CANCEL')
166
167    def execute(self, context):
168        ob = context.active_object
169        pass_count = 0
170        if 'BaseBone' in ob:
171            del ob['BaseBone']
172        for i in range(99999):
173            name = "BoneData:" + str(i)
174            if name in ob:
175                del ob[name]
176            else:
177                pass_count += 1
178            if 10 < pass_count:
179                break
180        pass_count = 0
181        for i in range(99999):
182            name = "LocalBoneData:" + str(i)
183            if name in ob:
184                del ob[name]
185            else:
186                pass_count += 1
187            if 10 < pass_count:
188                break
189        self.report(type={'INFO'}, message="ボーン情報を削除しました")
190        return {'FINISHED'}
@compat.BlRegister()
class CNV_OT_copy_object_bone_data_property(bpy_types.Operator):
45@compat.BlRegister()
46class CNV_OT_copy_object_bone_data_property(bpy.types.Operator):
47    bl_idname = 'object.copy_object_bone_data_property'
48    bl_label = "ボーン情報をコピー"
49    bl_description = "カスタムプロパティのボーン情報をクリップボードにコピーします"
50    bl_options = {'REGISTER', 'UNDO'}
51
52    @classmethod
53    def poll(cls, context):
54        ob = context.active_object
55        if ob:
56            if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
57                return True
58        return False
59
60    def execute(self, context):
61        output_text = ""
62        ob = context.active_object
63        pass_count = 0
64        if 'BaseBone' in ob:
65            output_text += "BaseBone:" + ob['BaseBone'] + "\n"
66        for i in range(99999):
67            name = "BoneData:" + str(i)
68            if name in ob:
69                output_text += "BoneData:" + ob[name] + "\n"
70            else:
71                pass_count += 1
72            if 10 < pass_count:
73                break
74        pass_count = 0
75        for i in range(99999):
76            name = "LocalBoneData:" + str(i)
77            if name in ob:
78                output_text += "LocalBoneData:" + ob[name] + "\n"
79            else:
80                pass_count += 1
81            if 10 < pass_count:
82                break
83        context.window_manager.clipboard = output_text
84        self.report(type={'INFO'}, message="ボーン情報をクリップボードにコピーしました")
85        return {'FINISHED'}
bl_idname = 'object.copy_object_bone_data_property'
bl_label = 'ボーン情報をコピー'
bl_description = 'カスタムプロパティのボーン情報をクリップボードにコピーします'
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
52    @classmethod
53    def poll(cls, context):
54        ob = context.active_object
55        if ob:
56            if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
57                return True
58        return False
def execute(self, context):
60    def execute(self, context):
61        output_text = ""
62        ob = context.active_object
63        pass_count = 0
64        if 'BaseBone' in ob:
65            output_text += "BaseBone:" + ob['BaseBone'] + "\n"
66        for i in range(99999):
67            name = "BoneData:" + str(i)
68            if name in ob:
69                output_text += "BoneData:" + ob[name] + "\n"
70            else:
71                pass_count += 1
72            if 10 < pass_count:
73                break
74        pass_count = 0
75        for i in range(99999):
76            name = "LocalBoneData:" + str(i)
77            if name in ob:
78                output_text += "LocalBoneData:" + ob[name] + "\n"
79            else:
80                pass_count += 1
81            if 10 < pass_count:
82                break
83        context.window_manager.clipboard = output_text
84        self.report(type={'INFO'}, message="ボーン情報をクリップボードにコピーしました")
85        return {'FINISHED'}
bl_rna = <bpy_struct, Struct("OBJECT_OT_copy_object_bone_data_property")>
Inherited Members
bpy_types.Operator
as_keywords
poll_message_set
builtins.bpy_struct
keys
values
items
get
pop
as_pointer
keyframe_insert
keyframe_delete
driver_add
driver_remove
is_property_set
property_unset
is_property_hidden
is_property_readonly
is_property_overridable_library
property_overridable_library_set
path_resolve
path_from_id
type_recast
bl_rna_get_subclass_py
bl_rna_get_subclass
id_properties_ensure
id_properties_clear
id_properties_ui
id_data
@compat.BlRegister()
class CNV_OT_paste_object_bone_data_property(bpy_types.Operator):
 88@compat.BlRegister()
 89class CNV_OT_paste_object_bone_data_property(bpy.types.Operator):
 90    bl_idname = 'object.paste_object_bone_data_property'
 91    bl_label = "ボーン情報を貼付け"
 92    bl_description = "カスタムプロパティのボーン情報をクリップボードから貼付けます"
 93    bl_options = {'REGISTER', 'UNDO'}
 94
 95    @classmethod
 96    def poll(cls, context):
 97        ob = context.active_object
 98        if ob:
 99            clipboard = context.window_manager.clipboard
100            if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard:
101                return True
102        return False
103
104    def execute(self, context):
105        ob = context.active_object
106        pass_count = 0
107        for i in range(99999):
108            name = "BoneData:" + str(i)
109            if name in ob:
110                del ob[name]
111            else:
112                pass_count += 1
113            if 10 < pass_count:
114                break
115        pass_count = 0
116        for i in range(99999):
117            name = "LocalBoneData:" + str(i)
118            if name in ob:
119                del ob[name]
120            else:
121                pass_count += 1
122            if 10 < pass_count:
123                break
124        bone_data_count = 0
125        local_bone_data_count = 0
126        for line in context.window_manager.clipboard.split("\n"):
127            if line.startswith('BaseBone:'):
128                ob['BaseBone'] = line[9:]  # len('BaseData:') == 9
129                continue
130
131            if line.startswith('BoneData:'):
132                if line.count(',') >= 4:
133                    name = "BoneData:" + str(bone_data_count)
134                    ob[name] = line[9:]  # len('BoneData:') == 9
135                    bone_data_count += 1
136                continue
137
138            if line.startswith('LocalBoneData:'):
139                if line.count(',') == 1:
140                    name = "LocalBoneData:" + str(local_bone_data_count)
141                    ob[name] = line[14:]  # len('LocalBoneData:') == 14
142                    local_bone_data_count += 1
143        self.report(type={'INFO'}, message="ボーン情報をクリップボードから貼付けました")
144        return {'FINISHED'}
bl_idname = 'object.paste_object_bone_data_property'
bl_label = 'ボーン情報を貼付け'
bl_description = 'カスタムプロパティのボーン情報をクリップボードから貼付けます'
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
 95    @classmethod
 96    def poll(cls, context):
 97        ob = context.active_object
 98        if ob:
 99            clipboard = context.window_manager.clipboard
100            if 'BoneData:' in clipboard and 'LocalBoneData:' in clipboard:
101                return True
102        return False
def execute(self, context):
104    def execute(self, context):
105        ob = context.active_object
106        pass_count = 0
107        for i in range(99999):
108            name = "BoneData:" + str(i)
109            if name in ob:
110                del ob[name]
111            else:
112                pass_count += 1
113            if 10 < pass_count:
114                break
115        pass_count = 0
116        for i in range(99999):
117            name = "LocalBoneData:" + str(i)
118            if name in ob:
119                del ob[name]
120            else:
121                pass_count += 1
122            if 10 < pass_count:
123                break
124        bone_data_count = 0
125        local_bone_data_count = 0
126        for line in context.window_manager.clipboard.split("\n"):
127            if line.startswith('BaseBone:'):
128                ob['BaseBone'] = line[9:]  # len('BaseData:') == 9
129                continue
130
131            if line.startswith('BoneData:'):
132                if line.count(',') >= 4:
133                    name = "BoneData:" + str(bone_data_count)
134                    ob[name] = line[9:]  # len('BoneData:') == 9
135                    bone_data_count += 1
136                continue
137
138            if line.startswith('LocalBoneData:'):
139                if line.count(',') == 1:
140                    name = "LocalBoneData:" + str(local_bone_data_count)
141                    ob[name] = line[14:]  # len('LocalBoneData:') == 14
142                    local_bone_data_count += 1
143        self.report(type={'INFO'}, message="ボーン情報をクリップボードから貼付けました")
144        return {'FINISHED'}
bl_rna = <bpy_struct, Struct("OBJECT_OT_paste_object_bone_data_property")>
Inherited Members
bpy_types.Operator
as_keywords
poll_message_set
builtins.bpy_struct
keys
values
items
get
pop
as_pointer
keyframe_insert
keyframe_delete
driver_add
driver_remove
is_property_set
property_unset
is_property_hidden
is_property_readonly
is_property_overridable_library
property_overridable_library_set
path_resolve
path_from_id
type_recast
bl_rna_get_subclass_py
bl_rna_get_subclass
id_properties_ensure
id_properties_clear
id_properties_ui
id_data
@compat.BlRegister()
class CNV_OT_remove_object_bone_data_property(bpy_types.Operator):
147@compat.BlRegister()
148class CNV_OT_remove_object_bone_data_property(bpy.types.Operator):
149    bl_idname = 'object.remove_object_bone_data_property'
150    bl_label = "ボーン情報を削除"
151    bl_description = "カスタムプロパティのボーン情報を全て削除します"
152    bl_options = {'REGISTER', 'UNDO'}
153
154    @classmethod
155    def poll(cls, context):
156        ob = context.active_object
157        if ob:
158            if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
159                return True
160        return False
161
162    def invoke(self, context, event):
163        return context.window_manager.invoke_props_dialog(self)
164
165    def draw(self, context):
166        self.layout.label(text="カスタムプロパティのボーン情報を全て削除します", icon='CANCEL')
167
168    def execute(self, context):
169        ob = context.active_object
170        pass_count = 0
171        if 'BaseBone' in ob:
172            del ob['BaseBone']
173        for i in range(99999):
174            name = "BoneData:" + str(i)
175            if name in ob:
176                del ob[name]
177            else:
178                pass_count += 1
179            if 10 < pass_count:
180                break
181        pass_count = 0
182        for i in range(99999):
183            name = "LocalBoneData:" + str(i)
184            if name in ob:
185                del ob[name]
186            else:
187                pass_count += 1
188            if 10 < pass_count:
189                break
190        self.report(type={'INFO'}, message="ボーン情報を削除しました")
191        return {'FINISHED'}
bl_idname = 'object.remove_object_bone_data_property'
bl_label = 'ボーン情報を削除'
bl_description = 'カスタムプロパティのボーン情報を全て削除します'
bl_options = {'REGISTER', 'UNDO'}
@classmethod
def poll(cls, context):
154    @classmethod
155    def poll(cls, context):
156        ob = context.active_object
157        if ob:
158            if 'BoneData:0' in ob and 'LocalBoneData:0' in ob:
159                return True
160        return False
def invoke(self, context, event):
162    def invoke(self, context, event):
163        return context.window_manager.invoke_props_dialog(self)
def draw(self, context):
165    def draw(self, context):
166        self.layout.label(text="カスタムプロパティのボーン情報を全て削除します", icon='CANCEL')
def execute(self, context):
168    def execute(self, context):
169        ob = context.active_object
170        pass_count = 0
171        if 'BaseBone' in ob:
172            del ob['BaseBone']
173        for i in range(99999):
174            name = "BoneData:" + str(i)
175            if name in ob:
176                del ob[name]
177            else:
178                pass_count += 1
179            if 10 < pass_count:
180                break
181        pass_count = 0
182        for i in range(99999):
183            name = "LocalBoneData:" + str(i)
184            if name in ob:
185                del ob[name]
186            else:
187                pass_count += 1
188            if 10 < pass_count:
189                break
190        self.report(type={'INFO'}, message="ボーン情報を削除しました")
191        return {'FINISHED'}
bl_rna = <bpy_struct, Struct("OBJECT_OT_remove_object_bone_data_property")>
Inherited Members
bpy_types.Operator
as_keywords
poll_message_set
builtins.bpy_struct
keys
values
items
get
pop
as_pointer
keyframe_insert
keyframe_delete
driver_add
driver_remove
is_property_set
property_unset
is_property_hidden
is_property_readonly
is_property_overridable_library
property_overridable_library_set
path_resolve
path_from_id
type_recast
bl_rna_get_subclass_py
bl_rna_get_subclass
id_properties_ensure
id_properties_clear
id_properties_ui
id_data